﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Text;
using System.Data;

namespace Phong_CTSV
{
    public class QuerrySQL
    {
        DBMLClassDataContext db = new DBMLClassDataContext();
        //Select
        #region Select User
        public string Select_Password(string user)
        {
            var i = (from n in db.Users 
                    where (n.Name==user) 
                    select n.Password).SingleOrDefault();
            return i;
        }
        public Role Select_RoleByUser(string user)
        { 
            var k = (from n in db.Users
                     where( n.Name == user)
                     select n).FirstOrDefault();
            Role i = null;
            if(k!=null)
            {
                i = (from n in db.Roles
                     where (n.ID == k.RoleID)
                     select n).FirstOrDefault();
            }
            return i;
        }
        public List<User> Select_AllUser()
        {
            var i = from n in db.Users select n;
            return i.ToList();
        }
        #endregion

        #region Select University
        public string Select_UniversityNameByUser(string user)
        {
            string j = "";
            try
            {
                var i = (from n in db.Users
                         where (n.Name == user)
                         select (n.Uni_id)).SingleOrDefault();
                j = (from m in db.Universities
                         where (m.ID == i)
                         select (m.Name)).SingleOrDefault();
            }
            catch
            {
                return "Lỗi ngoại lệ";
            }
            return j;
        }
        public List<User> Select_AllUserFromUniversity(string uniName)
        {
            var uni = (from n in db.Universities where (uniName == n.Name) select n).FirstOrDefault();
            return (from n in db.Users where (n.Uni_id == uni.ID) select n).ToList();
        }
        public University Select_UniversityByUser(string user)
        {
            var j = new University();
            try
            {
                var i = (from n in db.Users
                         where (n.Name == user)
                         select (n.Uni_id)).SingleOrDefault();
                j = (from m in db.Universities
                         where (m.ID == i)
                         select (m)).SingleOrDefault();
            }
            catch
            {
                return null;
            }
            return j;
        }
        public University Select_University(string UniversityName)
        {
            var i = (from n in db.Universities where (n.Name == UniversityName) select n).FirstOrDefault();
            return i;
        }
        public List<University> Select_AllUniversity()
        {
            var i = from n in db.Universities select n;
            return i.ToList();
        }

        #endregion

        #region Select DataTable
        public Data_Table Select_Data_Cell(long IDForm, long IDUniversity, int IDcol, int IDrow,int Year)
        {
            var i = new Data_Table();
            try
            {
                i = (from n in db.Data_Tables
                         where (IDForm == n.Form_id && IDUniversity == n.Uni_id && IDcol == n.Col_pos && IDrow == n.Row_pos && Year == n.Year_Report)
                         select n).FirstOrDefault();
            }
            catch
            {
                return null;
            }
            return i;
        }
        public Data_Table Select_Data_Cell(string FormName,string UniversityName,int IDcol,int IDrow,int Year)
        {
            
                var i = Select_Form(FormName);
                var j = Select_University(UniversityName);
            
            return Select_Data_Cell(i.Id, j.ID, IDcol, IDrow, Year);
        }
        public List<Data_Table> Select_Data_Rows(int IDForm, int IDUniversity, int IDrow,int Year)
        {
            var i = (from n in db.Data_Tables
                     where (IDForm == n.Form_id && IDUniversity == n.Uni_id && IDrow == n.Row_pos && Year == n.Year_Report)
                     select n).ToList();
            return i;
        }
        public List<Data_Table> Select_Data_Columns(int IDForm, int IDUniversity, int IDcol,int Year)
        {
            var i = (from n in db.Data_Tables
                     where (IDForm == n.Form_id && IDUniversity == n.Uni_id && IDcol == n.Col_pos && Year == n.Year_Report)
                     select n).ToList();
            return i;
        }
        #endregion

        #region Select Columns Header
        public List<Columns_Header> Select_ColumnsHeaderByForm(string NameForm)
        {

            var j = new List<Columns_Header>();
           try
            {
                var i = (from n in db.Forms where (NameForm == n.Name) select (n.Id)).SingleOrDefault();
                j = (from m in db.Columns_Headers where (i == m.Form_id) orderby m.ID select m).ToList();
            }
            catch
            {
                return null;
            }
            return j;
        }
        #endregion

        #region Select Rows Header
        public List<Rows_Header> Select_RowsHeaderByForm(string NameForm)
        {
            var j = new List<Rows_Header>();
            try
            {
                var i = (from n in db.Forms where (NameForm == n.Name) select (n.Id)).SingleOrDefault();
                j = (from m in db.Rows_Headers where (i == m.Form_id) orderby m.ID select m).ToList();
            }
            catch
            {
                return null;
            }
            return j;
        }
        #endregion

        public string Select_Role(string userName)
        {
            string k = "";
            try
            {
                var i = (from n in db.Users where (n.Name == userName) select n).FirstOrDefault();
                k = (from n in db.Roles where (i.RoleID == n.ID) select n.RoleName).FirstOrDefault();
            }
            catch 
            {
                return "Lỗi ngoại lệ";
            }
            return k;

        }
        public long Select_RoleID(string userName)
        {
            var i = (from n in db.Users where (n.Name == userName) select n).FirstOrDefault();
            return i.RoleID;

        }
        public List<Form> Select_AllForm()
        {
            var i = from n in db.Forms select n;
            return i.ToList();

        }
        public Form Select_Form(string Name)
        {
            var i = (from n in db.Forms where(n.Name==Name) select n).FirstOrDefault();
            return i;
        }
        //Insert

        public string Insert_University(string Name,string Location,string Email,string Phone )
        {
         
            if (string.IsNullOrWhiteSpace(Name))
                return "Tên trường phải khác rỗng";
            var i = (from n in db.Universities where (n.Name == Name) select n);
            if (i.Count() != 0)
                return Name + " đã tồn tại.";
            var j = (from n 
                         in db.Universities
                     orderby n.ID descending
                     select n.ID).FirstOrDefault();
            var uni = new University();
            {
               
                uni.Name = Name;
                uni.Location=Location ;
                uni.Email=Email;
                uni.Phone=Phone;
            };
            db.Universities.InsertOnSubmit(uni);
            try
            {
                db.SubmitChanges();
            }
            catch
            {
                return "Tên trường đã tồn tại";
            }
            return "Thêm mới thành công";
        }
        public string Insert_User(string User, string password, string NameUni,int Role)
        {
      
            if (string.IsNullOrWhiteSpace(password))
                return "Mật khẩu không được để trống";
            if (string.IsNullOrWhiteSpace(User))
                return "Tên đăng nhập không được để trống";
            if (string.IsNullOrWhiteSpace(NameUni))
                return "Tên trường không được để trống";
            var temp = (from n in db.Users where (User == n.Name) select n);
            if (temp.Count() != 0)
                return "Tên đăng nhập đã tồn tại";
            var i = (from n 
                         in db.Universities
                     where (NameUni == n.Name) 
                     select n.ID).FirstOrDefault();
            var j = (from n
                         in db.Users
                     orderby n.ID descending
                     select n.ID).FirstOrDefault();
            var user = new User
            {
                
             
                 Name=User,
                 Password = password,
                 Uni_id=i,
                 RoleID = Role
            };
            db.Users.InsertOnSubmit(user);
            try
            {
                db.SubmitChanges(); 
            }
            catch
            { 
                return "Tên đăng nhập đã tồn tại";
            }
            return "Tạo tài khoản thành công";
        }
        public string Insert_User(string User, string password, string NameUni, string Role)
        {

            if (string.IsNullOrWhiteSpace(password))
                return "Mật khẩu không được để trống";
            if (string.IsNullOrWhiteSpace(User))
                return "Tên đăng nhập không được để trống";
            if (string.IsNullOrWhiteSpace(NameUni))
                return "Tên trường không được để trống";
            if (string.IsNullOrWhiteSpace(Role))
                return "Quyền truy cập không được để trống";
            var temp = (from n in db.Users where (User == n.Name) select n);
            if (temp.Count() != 0)
                return "Tên đăng nhập đã tồn tại";
            var i = (from n
                         in db.Universities
                     where (NameUni == n.Name)
                     select n.ID).FirstOrDefault();
            var j = (from n
                         in db.Users
                     orderby n.ID descending
                     select n.ID).FirstOrDefault();
            var k = (from n
                     in db.Roles
                     where (n.RoleName == Role)
                     select n.ID).FirstOrDefault();
            var user = new User
            {

              
                Name = User,
                Password = password,
                Uni_id = i,
                RoleID = k,
            };
            db.Users.InsertOnSubmit(user);
            try
            {
                db.SubmitChanges();
            }
            catch
            {
                return "Tên đăng nhập đã tồn tại";
            }
            return "Tạo tài khoản thành công";
        }
        public string Insert_Form(string Name, int Cols_header,int Rows_header,bool HasRow,bool IsChange,bool IsSum)
        {
            if (string.IsNullOrWhiteSpace(Name))
                return "Tên bảng không được để trống";
            var n = new Form();
           
            n.Name = Name;
            n.Cols_header = Cols_header;
            n.Rows_header = Rows_header;
            n.Has_rows = HasRow;
            n.IsChange = IsChange;
            n.IsSum = IsSum;
            db.Forms.InsertOnSubmit(n);
            try
            {
                db.SubmitChanges();
            }
            catch
            {
                return "Bảng đã tồn tại";

            }
            return "Tạo bảng thành công";
        }
        
        #region Insert Data
        public string Insert_Data(string NameForm, string NameUni, int Year, long ColPos, long RowPos, string Name, string CodeName, string ValueRange, string ValueType, string Value)
        {
            if (string.IsNullOrWhiteSpace(NameForm))
                return "Tên bảng không được để trống";
            if (string.IsNullOrWhiteSpace(NameUni))
                return "Tên trường không được để trống"; 
            if (string.IsNullOrWhiteSpace(Name))
                return "Tên dữ liệu không được để trống";
            if (string.IsNullOrWhiteSpace(CodeName))
                return "Mã dữ liệu không được để trống";
            if (string.IsNullOrWhiteSpace(ValueRange))
                return "Vùng dữ liệu không được để trống";
            if (string.IsNullOrWhiteSpace(ValueType))
                return "Loại dữ liệu không được để trống";
            if(string.IsNullOrWhiteSpace(Value))
                 return "Giá trị dữ liệu không được để trống";
            var i = (from n in db.Universities where(n.Name == NameUni) select n.ID).FirstOrDefault();
            var j = (from n in db.Forms where (n.Name == NameForm) select n.Id).FirstOrDefault();
          
            var data = new Data_Table();
          
            data.Uni_id = i;
            data.Form_id = j;
            data.Col_pos = ColPos;
            data.Row_pos = RowPos;
            data.Name = Name;
            data.Code_name = CodeName;
            data.Value_range = ValueRange;
            data.Value_type = ValueType;
            data.Year_Report = Year;
            data.Value = Value;
            db.Data_Tables.InsertOnSubmit(data);
            
            try
            {
                db.SubmitChanges();
            }
            catch(Exception e)
            {
                return e.ToString();// "Lỗi không hợp lệ";
            }
            return "Thêm thành công";
        }
        public string Insert_Data(long FormID, long UniID, int Year, long ColPos, long RowPos, string Name, string CodeName, string ValueRange, string ValueType, string Value)
        {
          
            if (string.IsNullOrWhiteSpace(Name))
                return "Tên dữ liệu không được để trống";
            if (string.IsNullOrWhiteSpace(CodeName))
                return "Mã dữ liệu không được để trống";
            if (string.IsNullOrWhiteSpace(ValueRange))
                return "Vùng dữ liệu không được để trống";
            if (string.IsNullOrWhiteSpace(ValueType))
                return "Loại dữ liệu không được để trống";
            //if(string.IsNullOrWhiteSpace(Value))
            //     return "Giá trị dữ liệu không được để trống";
        

            var data = new Data_Table();
       
            data.Uni_id = UniID;
            data.Form_id = FormID;
            data.Col_pos = ColPos;
            data.Row_pos = RowPos;
            data.Name = Name;
            data.Year_Report = Year;
            data.Code_name = CodeName;
            data.Value_range = ValueRange;
            data.Value_type = ValueType;
            data.Value = Value;
            db.Data_Tables.InsertOnSubmit(data);
            try
            {
                db.SubmitChanges();
            }
            catch
            {
                return "Lỗi không hợp lệ";
            }
            return "Thêm thành công";
        }
        #endregion

        public string Insert_Columns_Header(string FormName, string Name, long ParentId, bool hasChild,string Kind_General)
        {
            if (string.IsNullOrWhiteSpace(Name))
                return "Tên cột không được để trống";
            var columnHeader = new Columns_Header();
            var j = (from n in db.Forms where (n.Name == FormName) select n).FirstOrDefault();
       
      
            columnHeader.Form_id = j.Id;
            columnHeader.Name = Name;
            columnHeader.Has_child = hasChild;
            columnHeader.Kind = Kind_General;

            if (hasChild)
            {
               
                columnHeader.Parent_id = ParentId;
            }
            db.Columns_Headers.InsertOnSubmit(columnHeader);
            try
            {
                j.Cols_header = (j.Cols_header + 1);
                db.SubmitChanges();
            }
            catch
            {
                return "Lỗi không hợp lệ";
            }
            return "Thêm thành công";
        }
     
        public string Insert_Rows_Header(string FormName, string Name, long ParentId, bool hasChild)
        {
            if (string.IsNullOrWhiteSpace(Name))
                return "Tên dòng không được để trống";
            var j = (from n in db.Forms where (n.Name == FormName) select n).FirstOrDefault();
         
            var rowHeader = new Rows_Header();
   
            rowHeader.Form_id = j.Id;
            rowHeader.Name = Name;
            rowHeader.Has_child = hasChild;
            if (hasChild)
            {
                rowHeader.Parent_id = ParentId;
            }
            db.Rows_Headers.InsertOnSubmit(rowHeader);
            try
            {
                j.Rows_header++;
                db.SubmitChanges();
            }
            catch
            {
                return "Lỗi không hợp lệ";
            }
            return "Thêm thành công";
        }
        //Update

        public string Update_PasswordByUserName(string User, string Password)
        {
            if (string.IsNullOrWhiteSpace(Password))
                return "Mật khẩu không được để trống";
            var i = (from n in db.Users where (n.Name == User) select n).FirstOrDefault();

            try
            {
                i.Password = Password;
                db.SubmitChanges();
            }
            catch { return "Lỗi cập nhật"; }
            return "Cập nhật thành công";
        }

        public void Update_Role(string User, string RoleName)
        {
            
            try
            {
                
                var i = (from n in db.Users where (n.Name == User) select n).FirstOrDefault();
                var k = (from n in db.Roles where (n.RoleName == RoleName) select n).FirstOrDefault();
                i.RoleID = k.ID;
                db.SubmitChanges();
            }
            catch 
            { 
                throw new Exception ("Lỗi cập nhật");
            }
           
        }

        #region Update University
        public string Update_UniversityLocationByName(string UniversityName, string Location)
        {
            var i = (from n in db.Universities where(n.Name == UniversityName) select n).FirstOrDefault();

            try
            {
                i.Location = Location;
                db.SubmitChanges();
            }
            catch { return "Lỗi cập nhật"; }
            return "Cập nhật thành công";
        }
        public string Update_UniversityEmailByName(string UniversityName, string Email)
        {
            var i = (from n in db.Universities where (n.Name == UniversityName) select n).FirstOrDefault();

            try
            {
                i.Email = Email;
                db.SubmitChanges();
            }
            catch { return "Lỗi cập nhật"; }
            return "Cập nhật thành công";
        }
        public string Update_UniversityPhoneByName(string UniversityName, string Phone)
        {
            var i = (from n in db.Universities where (n.Name == UniversityName) select n).FirstOrDefault();

            try
            {
                i.Phone = Phone;
                db.SubmitChanges();
            }
            catch { return "Lỗi cập nhật"; }
            return "Cập nhật thành công";
        }
        public string Update_UniversityByName(string UniversityName,string Location,string Email, string Phone)
        {
            var i = (from n in db.Universities where (n.Name == UniversityName) select n).FirstOrDefault();

            try
            {
                i.Location = Location;
                i.Email = Email;
                i.Phone = Phone;
                db.SubmitChanges();
            }
            catch { return "Lỗi cập nhật"; }
            return "Cập nhật thành công";
        }
        #endregion

        #region Update Row Header
        public string Update_RowsHeaderName(int Id, int FormId, string Name)
        {
            var i = (from n in db.Rows_Headers where (n.ID == Id && n.Form_id == FormId) select n).FirstOrDefault();
            try
            {
                i.Name = Name;
                db.SubmitChanges();
            }
            catch { return "Lỗi cập nhật"; }
            return "Cập nhật thành công";
        }
        public string Update_RowsHeaderName(string RowName, string FormName, string Name)
        {
            var j = (from n in db.Forms where (FormName == n.Name) select n).FirstOrDefault();
            var i = (from n in db.Rows_Headers where (n.Name == RowName && n.Form_id == j.Id) select n).FirstOrDefault();
            try
            {
                i.Name = Name;
                db.SubmitChanges();
            }
            catch { return "Lỗi cập nhật"; }
            return "Cập nhật thành công";
        }
        #endregion

        #region Update Column Header
        public string Update_ColumnsHeaderName(int Id, int FormId, string Name)
        {
            var i = (from n in db.Columns_Headers where (n.ID == Id && n.Form_id == FormId) select n).FirstOrDefault();
            try
            {
                i.Name = Name;
                db.SubmitChanges();
            }
            catch { return "Lỗi cập nhật"; }
            return "Cập nhật thành công";
        }
        public string Update_ColumnsHeaderName(string ColumnName, string FormName, string Name)
        {
            var j = (from n in db.Forms where (FormName == n.Name) select n).FirstOrDefault();
            var i = (from n in db.Columns_Headers where (n.Name == ColumnName && n.Form_id == j.Id) select n).FirstOrDefault();
            try
            {
                i.Name = Name;
                db.SubmitChanges();
            }
            catch { return "Lỗi cập nhật"; }
            return "Cập nhật thành công";
        }
        #endregion

        #region Update Form
        public string UpdateFormNameById(int Id,string Name)
        {
            var i = (from n in db.Forms where (n.Id == Id ) select n).FirstOrDefault();
            try
            {
                i.Name = Name;
                db.SubmitChanges();
            }
            catch { return "Lỗi cập nhật"; }
            return "Cập nhật thành công";
        }
        public string UpdateFormNameByName(string NameForm, string Name)
        {
            var i = (from n in db.Forms where (n.Name == NameForm) select n).FirstOrDefault();
            try
            {
                i.Name = Name;
                db.SubmitChanges();
            }
            catch { return "Lỗi cập nhật"; }
            return "Cập nhật thành công";
        }
        public string UpdateFormIsChange(string NameForm, bool isChange)
        {
            var i = (from n in db.Forms where (n.Name == NameForm) select n).FirstOrDefault();
            try
            {
               i.IsChange = isChange;
                db.SubmitChanges();
            }
            catch { return "Lỗi cập nhật"; }
            return "Cập nhật thành công";
        }
        #endregion

        #region Update Data Table
        public string Update_DataCell(string NameForm, string NameUni, int Year, int ColPos, int RowPos, string Value)
        {
            var i = (from n in db.Forms where (n.Name == NameForm) select n).FirstOrDefault();
            var j = (from n in db.Universities where (n.Name == NameUni) select n).FirstOrDefault();
            var k = (from n in db.Data_Tables 
                     where (n.Form_id == i.Id && j.ID == n.Uni_id && Year == n.Year_Report && n.Col_pos == ColPos && n.Row_pos == RowPos ) 
                     select n).FirstOrDefault();
          
            try 
            {
                k.Value = Value;
                db.SubmitChanges();
            }
            catch { return "Cập nhật thất bại"; }
            return "Cập nhật thành công";
        }
        public string Update_DataCell(string NameForm, long IDUni, int Year, int ColPos, int RowPos, string Value)
        {
            var i = (from n in db.Forms where (n.Name == NameForm) select n).FirstOrDefault();
            
            var k = (from n in db.Data_Tables
                     where (n.Form_id == i.Id && IDUni == n.Uni_id && Year == n.Year_Report && n.Col_pos == ColPos && n.Row_pos == RowPos)
                     select n).FirstOrDefault();

            try
            {
                k.Value = Value;
                db.SubmitChanges();
            }
            catch { return "Cập nhật thất bại"; }
            return "Cập nhật thành công";
        }
        public string Update_DataTable(string NameForm, string NameUni,int Year, DataTable dataTable )
        {
            try
            {
                for (int i = 0; i < dataTable.Rows.Count; i++)
                {
                    for (int j = 0; j < dataTable.Columns.Count; j++)
                    {
                        Update_DataCell(NameForm,NameUni,Year,j,i,dataTable.Rows[i][j].ToString());
                    }
                }
            }
            catch { return "Cập nhật thất bại"; }
            return "Cập nhật thành công";
        }
        #endregion

        int Count_Row(List<Rows_Header> list, Rows_Header r)
        {
            if (r.Parent_id == 0)
                return 1;
            else
            {
                var t = (from n in list where(n.ID == r.Parent_id) select n).FirstOrDefault();
        
                return Count_Row(list,t) + 1;
            }
        }
        int Count_Column(List<Columns_Header> list,Columns_Header c)
        {
            if (c.Parent_id == 0)
                    return 1;
                else
                {
                    var t = (from n in list where(n.ID == c.Parent_id) select n).FirstOrDefault();
                  
                    return Count_Column(list,c) + 1;
                }
        }
        public void Insert_Data_ByColumn(string FormName, long UniID, int Year)
        {

            var form = (from n in db.Forms where(n.Name == FormName) select n).First();
             var data = (from n in db.Data_Tables
                            where (n.Form_id == form.Id &&
                                n.Uni_id == UniID
                                && Year == n.Year_Report)
                            select n).FirstOrDefault();
                if (data != null)
                    return;
                else
            if (form.Has_rows)
            {
               
               // else
                {
                    var allColumn = Select_ColumnsHeaderByForm(form.Name);
                    List<Columns_Header> column = new List<Columns_Header>();
                    foreach (var col in allColumn)
                    {
                        if (col.Parent_id == 0)
                        {
                            if (!col.Has_child)
                            {
                                column.Add(col);
                            }
                            foreach (var colchild in allColumn)
                            {
                                if (colchild.Parent_id == col.ID && !colchild.Has_child)
                                {
                                    column.Add(colchild);
                                }
                            }
                        }
                    }
                    var row = (from n in db.Rows_Headers where (form.Id == n.Form_id && !n.Has_child) select n).ToList();
                    int count = 0;
                    var allrow = (from n in db.Rows_Headers where (form.Id == n.Form_id) select n).ToList();
                    int deepRow = 0;
                    foreach (var item in allrow)
                    {
                       int temp =  Count_Row(allrow, item);
                       if (deepRow < temp)
                           deepRow = temp;
                    }
                    for (int i = deepRow; i < column.Count; i++)
                    {
                        for (int j = 0; j < row.Count; j++)
                        {
                            switch (column[i].Kind)
                            {
                                case "int":
                                    Insert_Data(form.Id, UniID, Year, i - deepRow, j, "Data", "c" + count.ToString(), "0", column[i].Kind.ToString(), "0");
                                    break;
                                case "average":
                                       Insert_Data(form.Id, UniID, Year, i - deepRow, j, "Data", "c" + count.ToString(), "0", column[i].Kind.ToString(), "0");
                                    break;
                                case "string":
                                    Insert_Data(form.Id, UniID, Year, i - deepRow, j, "Data", "c" + count.ToString(), "0", column[i].Kind.ToString(), "");
                                    break;
                                default:
                                    Insert_Data(form.Id, UniID, Year, i - deepRow, j, "Data", "c" + count.ToString(), "0", column[i].Kind.ToString(), "");
                                    break;
                            }
                            count++;
                        }
                    }
                }
            }
            else
            {
                Insert_Data_NewRow(FormName, UniID, Year);
            }
        }
        public void Insert_Data_ByColumn(string FormName, string UniName, int Year)
        {
         
            var uni = (from n in db.Universities where (UniName == n.Name) select n).FirstOrDefault();
            var form = (from n in db.Forms where (n.Name == FormName) select n).First();
            var data = (from n in db.Data_Tables
                            where (n.Form_id == form.Id &&
                                n.Uni_id == uni.ID
                                && Year == n.Year_Report)
                            select n).FirstOrDefault();
                if (data != null)
                    return;
                else
            if (form.Has_rows)
            {
                
             //   else
                {

                    var allColumn = Select_ColumnsHeaderByForm(form.Name);
                    List<Columns_Header> column= new List<Columns_Header>();
                    foreach (var col in allColumn)
                    {
                        if (col.Parent_id == 0)
                        {
                            if(!col.Has_child)
                            {
                                column.Add(col);
                            }
                            foreach (var colchild in allColumn)
                            {
                                if (colchild.Parent_id == col.ID && !colchild.Has_child)
                                {
                                    column.Add(colchild);
                                }
                            }
                        }
                    }
                    //var column = (from n in db.Columns_Headers where (form.Id == n.Form_id && !n.Has_child) orderby n.Parent_id select n).ToList();
                    var row = (from n in db.Rows_Headers where (form.Id == n.Form_id && n.Has_child == false) select n).ToList();
                    int count = 0;
                    var allrow = (from n in db.Rows_Headers where (form.Id == n.Form_id) select n).ToList();
                    int deepRow = 0;
                    foreach (var item in allrow)
                    {
                        int temp = Count_Row(allrow, item);
                        if (deepRow < temp)
                            deepRow = temp;
                    }
                    for (int i = deepRow; i < column.Count; i++)
                    {
                        for (int j = 0; j < row.Count; j++)
                        {
                            switch (column[i].Kind)
                            {
                                case "int":
                                    Insert_Data(form.Id, uni.ID, Year, i - deepRow, j, "Data", "c" + count.ToString(), "0", column[i].Kind.ToString(), "0");
                                    break;
                                case "average":
                                    Insert_Data(form.Id, uni.ID, Year, i - deepRow, j, "Data", "c" + count.ToString(), "0", column[i].Kind.ToString(), "0");
                                    break;
                                case "string":
                                    Insert_Data(form.Id, uni.ID, Year, i - deepRow, j, "Data", "c" + count.ToString(), "0", column[i].Kind.ToString(), "");
                                    break;
                                default:
                                    Insert_Data(form.Id, uni.ID, Year, i - deepRow, j, "Data", "c" + count.ToString(), "0", column[i].Kind.ToString(), "");
                                    break;
                            }
                            count++;
                        }
                    }

                }
            }
            else
            {
                Insert_Data_NewRow(FormName, UniName, Year);
            }
        }
     
        public void Insert_Data_NewRow(string FormName, long UniID, int Year)
        {
            try
            {
                var j = (from n in db.Forms where (FormName == n.Name) select n).FirstOrDefault();
                if (!j.Has_rows)
                {

                   
                    var temp = (from n in db.Data_Tables
                                where (UniID == n.Uni_id &&
                                    j.Id == n.Form_id &&
                                    Year == n.Year_Report)
                                select n).FirstOrDefault();
                    long rowNum;
                    if (temp == null)
                    {
                        rowNum = 0;
                    }
                    else
                    {
                        rowNum = (from n in db.Data_Tables
                                  where (UniID == n.Uni_id
                                      && j.Id == n.Form_id)
                                  orderby n.Col_pos
                                  descending
                                  select n.Row_pos).FirstOrDefault();
                    }
                    var allColumn = Select_ColumnsHeaderByForm(j.Name);
                    List<Columns_Header> column = new List<Columns_Header>();
                    foreach (var col in allColumn)
                    {
                        if (col.Parent_id == 0)
                        {
                            if (!col.Has_child)
                            {
                                column.Add(col);
                            }
                            foreach (var colchild in allColumn)
                            {
                                if (colchild.Parent_id == col.ID && !colchild.Has_child)
                                {
                                    column.Add(colchild);
                                }
                            }
                        }
                    }
                    int count = 0;
                    foreach (var item in column)
                    {
                        switch (item.Kind)
                        {
                            case "int":
                                Insert_Data(j.Id, UniID, Year, count, rowNum + 1, "Data", "c" + (count + (rowNum + 1) * count).ToString(), "0", item.Kind, "0");
                                break;
                            default:
                                Insert_Data(j.Id, UniID, Year, count, rowNum + 1, "Data", "c" + (count + (rowNum + 1) * count).ToString(), "0", item.Kind, "");
                                break;

                        }
                        count++;
                    }
                }
            }
            catch
            {
                throw new Exception("Lỗi truy vấn");
            }
        }
        public void Insert_Data_NewRow(string FormName, string UniName, int Year)
        {
            try
            {
                var j = (from n in db.Forms where (FormName == n.Name) select n).FirstOrDefault();
                if (!j.Has_rows)
                {
                    
                    var uni = (from n in db.Universities where (UniName == n.Name) select n).FirstOrDefault();
                    var temp = (from n in db.Data_Tables
                                where (uni.ID == n.Uni_id &&
                                    j.Id == n.Form_id &&
                                    Year == n.Year_Report)
                                select n).FirstOrDefault();
                    long rowNum;
                    if (temp == null)
                    {
                        rowNum = -1;
                    }
                    else
                    {
                        rowNum = (from n in db.Data_Tables
                                  where (uni.ID == n.Uni_id
                                      && j.Id == n.Form_id)
                                  orderby n.Col_pos 
                                  descending 
                                  select n.Row_pos).FirstOrDefault();
                    }
                    var allColumn = Select_ColumnsHeaderByForm(j.Name);
                    List<Columns_Header> column = new List<Columns_Header>();
                    foreach (var col in allColumn)
                    {
                        if (col.Parent_id == 0)
                        {
                            if (!col.Has_child)
                            {
                                column.Add(col);
                            }
                            foreach (var colchild in allColumn)
                            {
                                if (colchild.Parent_id == col.ID && !colchild.Has_child)
                                {
                                    column.Add(colchild);
                                }
                            }
                        }
                    }
                    int count = 0;
                    foreach (var item in column)
                    {
                        switch (item.Kind)
                        {
                            case "int":
                                Insert_Data(j.Id, uni.ID, Year, count, rowNum + 1, "Data","c" + (count + (rowNum+1) *count).ToString() , "0",item.Kind, "0");
                                break;
                            default:
                                  Insert_Data(j.Id, uni.ID, Year, count, rowNum + 1, "Data","c" + (count + (rowNum+1)*count).ToString() , "0",item.Kind, "");
                                  break;

                        }
                        count++;
                    }
                }
            }
            catch 
            {
                throw new Exception("Lỗi truy vấn");
            }
        }
        public void Remove_User(string UserName)
        {
         
            try
            {
                var user = (from n in db.Users where (UserName == n.Name) select n).FirstOrDefault();
                db.Users.DeleteOnSubmit(user);
                db.SubmitChanges();
            }
            catch
            { 
                throw new Exception("Lỗi ngoại lệ");
            }
        }
        public void Remove_Row(long FormID, long UniID, int Year,int row)
        {
            try
            {
                var rowData = (from n in db.Data_Tables
                               where (n.Form_id == FormID
                               && UniID == n.Uni_id
                               && Year == n.Year_Report
                               && row == n.Row_pos)
                               select n).ToList();
                foreach (var item in rowData)
                {
                    db.Data_Tables.DeleteOnSubmit(item);
                }
                db.SubmitChanges();
            }
            catch
            {
                throw new Exception("Lỗi ngoại lệ");
            }
        }

        public int maxColumnHeader(string FormName)
        {
            var form = (from n in db.Forms where (n.Name == FormName) select n).FirstOrDefault();
            var allcol = (from n in db.Columns_Headers where (form.Id == n.Form_id) select n).ToList();
            int max = 0;
            foreach (var item in allcol)
            {
                int temp = Count_Column(allcol, item);
                if (max < temp)
                    max = temp;
            }
            return max;
        }
        public int maxRowHeader(string FormName)
        {
            var form = (from n in db.Forms where (n.Name == FormName) select n).FirstOrDefault();
            var allrow = (from n in db.Rows_Headers where (form.Id == n.Form_id) select n).ToList();
            int max = 0;
            foreach (var item in allrow)
            {
                int temp = Count_Row(allrow,item);
                if (max < temp)
                    max = temp;
            }
            return max;
        }
        public int maxColumn(string FormName, string UniName, int Year)
        {
             int max = 0;
             try
             {
                 var form = (from n in db.Forms where (n.Name == FormName) select n).FirstOrDefault();
                 var uni = (from n in db.Universities where (n.Name == UniName) select n).FirstOrDefault();
                 var database = (from n in db.Data_Tables
                                 where (n.Uni_id == uni.ID &&
                                     n.Form_id == form.Id &&
                                     n.Year_Report == Year)
                                 select n).ToList();
                 foreach (var item in database)
                 {
                     if (max < item.Col_pos)
                         max = (int)item.Col_pos;
                 }

             }
             catch
             {
                 return 0;
             }
             return max+1;
        }
        public int maxRow(string FormName, string UniName, int Year)
        {
            int max = 0;
            try
            {
                var form = (from n in db.Forms where (n.Name == FormName) select n).FirstOrDefault();
                var uni = (from n in db.Universities where (n.Name == UniName) select n).FirstOrDefault();
                var database = (from n in db.Data_Tables
                                where (n.Uni_id == uni.ID &&
                                    n.Form_id == form.Id &&
                                    n.Year_Report == Year)
                                select n).ToList();
                foreach (var item in database)
                {
                    if (max < item.Row_pos)
                        max = (int)item.Row_pos;
                }

            }
            catch
            {
                return 0;
            }
            return max+1;
        }


        public void Insert_News(string Title, string Content, DateTime date)
        {
            try
            {
                var news = new New();
                {
                    news.Title = Title;
                    news._Content = Content;
                    news.Time = date;


                };
                db.News.InsertOnSubmit(news);
                db.SubmitChanges();
            }
            catch { throw new Exception("Thêm thất bại"); }
        }
        public New Select_LastNews()
        {
            var news = (from n in db.News orderby n.ID descending select n).FirstOrDefault();
            return news;
        }
        public List<New> Select_AllNews()
        {
            var listnews = (from n in db.News select n).ToList();
            return listnews;
        }
        public void Update_News(int ID, string Content)
        {
            try
            {
                var news = (from n in db.News where (n.ID == ID) select n).FirstOrDefault();
                news._Content = Content;
                db.SubmitChanges();
            }
            catch { throw new Exception("Cập nhật thất bại"); }
        }
    }
}